#pragma once

#include<iostream>
#include<exception>
// using namespace std;
 
 
//单例类 PrintSpoolerSingleton （打印池类） 
class PrintSpoolerSingleton{
public:
	static PrintSpoolerSingleton* getInstance(){
		if(instance == nullptr){
			instance = new PrintSpoolerSingleton();
		}else{
			throw (char*)"打印池正在工作中!"; 
		}
		return PrintSpoolerSingleton::instance;//用类的作用域访问 
	} 
	void manageJobs(){
		std::cout << "管理打印任务" << std::endl;
	}
	
private:
	static PrintSpoolerSingleton* instance;
	
	//私有(隐藏)构造函数，仅供类内调用，只调用一次 
	PrintSpoolerSingleton(){
		std::cout <<  "创建打印池!" << std::endl;
	}
	
	~PrintSpoolerSingleton(){
		//因为单例是指针，无法调用析构函数 ，需要辅助类实现 
		
	}
	
	//辅助类
	class Free {
	public:
		Free(){std::cout <<  "创建Free!" << std::endl;}
		~Free(){
			if(instance != nullptr){
				delete instance;
				instance = nullptr;
				std::cout << "打印池关闭!"  << std::endl; 
			}
		}
	};
	static Free m_free; //这里需要设为静态才行 ，且需要在外部实例化 
};
 
//C++静态变量需要在类外初始化 
PrintSpoolerSingleton* PrintSpoolerSingleton::instance = nullptr;
PrintSpoolerSingleton::Free PrintSpoolerSingleton::m_free;